package main;

import presenter.duplicate.FileSizer;
import presenter.list.FileListor;
import utils.OnLogListener;
import presenter.delete.FileDeletor;
import presenter.duplicate.FileDuplicator;
import presenter.equals.EqualsParser;
import presenter.flat.DirFlater;
import presenter.md5.MD5Parser;
import presenter.rename.FileRenamer;
import presenter.split.Spliter;
import utils.TextUtils;

public enum InputMode {
    Tip("tip", "展示说明"),
    Duplicate("duplicate",
            "[path] [path]，文件去重,一级维度是文件大小比较,二级维度是md5值比较。" +
                    "【1】可以一个文件夹地址去重，此时删除这个文件夹内的重复文件。" +
                    "【2】也可以给两个文件夹地址,第一个文件夹为主,第二个文件夹为次：" +
                    "如果两个文件夹里有重复文件，先删次的，只保留一个主文件夹内的文件。(大文件过滤：超过100M的文件先key = size + name 进行第一次过滤，防止大文件md5特别慢)"),
    DuplicateExact("duplicate_exact", "[path] [path]，在次文件夹里面删除和主文件夹相同的文件，注意：不会对次文件夹本身的文件重复做过滤处理。(大文件过滤：超过100M的文件先key = size + name 进行第一次过滤，防止大文件md5特别慢)"),
    DuplicateSize("duplicate_size", "[path] [path]，比较文件夹文件的大小，如果大小相等，则输出，需要自己进行比较，自行判断删除"),
    Del("delete", "[path] [name]，将对应文件夹下指定名称的文件删除，包括隐藏的文件"),
    FlatDir("flat", "[path]，将此文件夹拍平"),
    FlatDir2("flat2", "[path]，将此文件夹下面的二级文件夹拍平"),
    List("list", "[path]，列出此文件夹下所有的文件以及文件夹"),
    ListDir("list-dir", "[path]，列出此文件夹下所有的文件夹"),
    MD5("md5", "[path]，打印当前文件夹下文件的md5"),

    Equals("equals", "[file] [file]，文件一致性检查，比较md5值"),
    Split("split", "[path] [size] [prefix] [?start_index]，文件夹分割，参数一为路径，参数二为分割的大小"),
    ReSplit("re_split", "[path] [size] [prefix] [?start_index]，文件夹重新分割，会先拍平，再分割"),

    GoPro("gopro", "[path]，GoPro的文件重命名"),
    Recorder("recorder", "[path]，录屏,目前包括三星、华为、锤子录屏、枞阳监控、海康威视,视频重命名"),
    Custom("custom", "[path][preFix]，遍历path下面所有文件，删除包含preFix的字符"),
    CodeParser("code", "[path]，打码文件解析,提取需要的信息");

    public final String tag;
    private final String tip;

    InputMode(String tag, String tip) {
        this.tag = tag;
        this.tip = tip;
    }

    public String tag() {
        return tag;
    }

    public static InputMode parse(String tag) {
        for (InputMode mode : InputMode.values()) {
            if (TextUtils.equals(mode.tag, tag)) {
                return mode;
            }
        }
        return null;
    }

    public static String tip() {
        if (BuildConfig.isDebug) {
            return null;
        } else {
            StringBuilder builder = new StringBuilder();
            String split = "----------->";
            for (InputMode mode : InputMode.values()) {
                builder.append(mode.tag);
                builder.append(split);
                builder.append(mode.tip);
                builder.append("\n");
            }
            builder.append("--------------------------------------------\n");
            return builder.toString();
        }
    }

    public static void action(String tip, InputBean info, OnLogListener listener) {
        listener.log(tip);
        if (info != null) {
            switch (info.mode()) {
                case Tip:
                    listener.taskFinish();
                    break;
                case GoPro:
                case Recorder:
                case Custom:
                    FileRenamer.parse(info, listener);
                    break;
                case Duplicate:
                case DuplicateExact:
                    FileDuplicator.del(info, listener);
                    break;
                case DuplicateSize:
                    FileSizer.parse(info, listener);
                    break;
                case Del:
                    FileDeletor.del(info, listener);
                    break;
                case CodeParser:
                    presenter.code.CodeParser.parse(info, listener);
                    break;
                case MD5:
                    MD5Parser.parse(info, listener);
                    break;
                case Equals:
                    EqualsParser.check(info, listener);
                    break;
                case Split:
                case ReSplit:
                    Spliter.split(info, listener);
                    break;
                case FlatDir:
                case FlatDir2:
                    DirFlater.flat(info, listener);
                    break;
                case List:
                case ListDir:
                    new FileListor(info, listener);
                    break;
                default:
                    listener.log("输入的模式不存在");
                    listener.taskFinish();
                    break;
            }
        } else {
            listener.log("输入的参数不合法!");
            listener.taskFinish();
        }
    }
}
